package com.cnap.multiclouldmgmt.service;

import com.cnap.multiclouldmgmt.model.RepByPage;
import com.cnap.multiclouldmgmt.model.scale.CreateScalingDTO;
import com.cnap.multiclouldmgmt.model.scale.QueryScalingConfigParam;
import com.cnap.multiclouldmgmt.model.scale.ScalingConfigDTO;
import com.cnap.multiclouldmgmt.model.scale.ScalingConfigVO;
import com.cnap.multiclouldmgmt.model.scale.db.ScalingResourcePO;
import com.cnap.multiclouldmgmt.model.scale.group.QueryScalingGroupParam;
import com.cnap.multiclouldmgmt.model.scale.group.ScalingGroupDTO;
import com.cnap.multiclouldmgmt.model.scale.group.ScalingGroupVO;
import com.cnap.multiclouldmgmt.model.scale.intelligent.QueryThresholdParam;
import com.cnap.multiclouldmgmt.model.scale.policy.ScalingPolicyDTO;

import java.util.List;

/**
 * 伸缩服务类
 *
 * @author xc
 **/
public interface ScalingService {

    /**
     * 分页查询
     *
     * @param param 参数
     * @return 结果
     */
    RepByPage<ScalingGroupVO> findByPage(QueryScalingGroupParam param);


    /**
     * 创建伸缩组
     *
     * @param scalingGroupDTO 伸缩组信息
     * @return 结果
     */
    boolean createScalingGroup(ScalingGroupDTO scalingGroupDTO);

    /**
     * 启用伸缩组
     *
     * @param groupId 分组id
     * @return 结果
     */
    boolean startScale(String groupId);

    /**
     * 停用伸缩组
     *
     * @param groupId 伸缩组id
     * @return 结果
     */
    boolean stopScale(String groupId);


    /**
     * 删除伸缩组
     *
     * @param groupId                     伸缩组id
     * @param needSendDeleteRequestToCnap 是否需要同步更新到cnap
     * @return 结果
     */
    boolean deleteScalingGroup(String groupId, boolean needSendDeleteRequestToCnap);

    /**
     * 创建伸缩策略
     *
     * @param scalingPolicyDTOs 伸缩策略信息
     * @return 结果
     */
    boolean createScalingPolicy(List<ScalingPolicyDTO> scalingPolicyDTOs);

    /**
     * 分页查询伸缩配置
     *
     * @param param 参数
     * @return 结果
     */
    RepByPage<ScalingConfigVO> findByPage(QueryScalingConfigParam param);

    /**
     * 创建伸缩配置
     *
     * @param scalingConfigDTO 配置
     * @return 结果
     */
    boolean createScalingConfig(ScalingConfigDTO scalingConfigDTO);

    /**
     * 根据id删除伸缩配置
     *
     * @param configId 配置id
     * @return 结果
     */
    boolean deleteScalingConfigById(String configId);


    /**
     * 查询所有云资源规格
     *
     * @return 结果
     */
    List<ScalingResourcePO> getAllCloudResources();

    /**
     * 根据id查询规格配置
     *
     * @param resourceId id
     * @return 结果
     */
    ScalingResourcePO getCloudResourceById(String resourceId);

    /**
     * 创建默认伸缩组
     *
     * @param userName       用户名称
     * @param clusterName    集群名称
     * @param cloudVendor    云商信息
     * @param currentNodeNum 当前集群的node数量
     */
    void createDefaultScalingGroupForNewCluster(String userName, String clusterName, String cloudVendor, int currentNodeNum);

    /**
     * 创建默认伸缩组
     *
     * @param userName         用户名称
     * @param clusterName      集群名称
     * @param cloudVendor      云商信息
     * @param accountName      云账户名称
     * @param currentNodeNum   当前集群的node数量
     * @param createScalingDTO 扩缩容策略信息
     */
    void createDefaultScalingGroupForNewCluster(String userName, String clusterName, String cloudVendor, String accountName,
                                                int currentNodeNum, CreateScalingDTO createScalingDTO);


    /**
     * 根据集群名称删除伸缩组
     *
     * @param clusterName 集群名称
     */
    void deleteByClusterName(String clusterName);

    /**
     * 创建默认的伸缩组（全套）
     *
     * @param dtos 参数
     */
    void updateScalingPolicy(List<CreateScalingDTO> dtos);

    /**
     * 查询智能告警阈值
     *
     * @param queryThresholdParam 参数
     * @return 值（cpu: 百分数，请求响应：毫秒）
     */
    String getIntelligentThreshold(QueryThresholdParam queryThresholdParam);

    /**
     * 根据集群名称和label(微服务id)删除
     *
     * @param clusterName 集群名称
     * @param label       label
     */
    void deleteByClusterNameAndLabel(String clusterName, String label);

}
